home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / util / misc / unt.lha / UnT.e < prev   
Text File  |  1994-03-28  |  5KB  |  197 lines

  1. /*  This program should take a .t64 file and pull it apart into */
  2. /*  the original, separate CBM files. */
  3.  
  4. /*  Written by pbhoeffl@undergrad.math.uwaterloo.ca */
  5. /*  on March 26-7, 1994 */
  6.  
  7. /*  Development Suite:  */
  8. /*  Hardware:  A500 KS1.3 WB1.3 */
  9. /*  Software:  Amiga E v2.1b, Vim 2.0 */
  10.  
  11. /*  I maintain no copyright on this program, and hereby release */
  12. /*  it into the public domain.  If I am violating someone elses */
  13. /*  copyright by releasing this as such... well, I guess that's */
  14. /*  my tough luck. */
  15.  
  16.  
  17.  
  18. ENUM NOARG, NOARCHIVE, EMPTYARCHIVE, NOMEMORY, READERROR
  19. ENUM CANTCREATE, WRITEERROR
  20.  
  21.  
  22. DEF flen, handle=NIL, mem
  23.  
  24. PROC main ()  HANDLE
  25.     DEF i, j, numFiles, numUsed, prompt[16]:STRING
  26.  
  27.     IF arg[0]=0 THEN Raise (NOARG)
  28.     /* WriteF ('Archive is:  \s\n', arg) */
  29.  
  30.     handle := Open(arg, OLDFILE)
  31.     IF handle = NIL THEN Raise (NOARCHIVE)
  32.     flen := FileLength (arg)
  33.     IF flen < 1 THEN Raise (EMPTYARCHIVE)
  34.     /* WriteF ('Located \s.  Size=\d\n', arg, flen) */
  35.  
  36.     mem := New (flen)
  37.     IF mem = NIL THEN Raise (NOMEMORY)
  38.     /* WriteF ('Memory successfully allocated.\n') */
  39.  
  40.     IF Read (handle, mem, flen) <> flen THEN Raise (READERROR)
  41.     /* WriteF ('Read archive successfully.\n', arg) */
  42.  
  43.     /*  We're done with the archive file */
  44.     Close (handle);  handle := NIL
  45.  
  46.     WriteF ('User Description :  ')
  47.     print_text (40, 24);  WriteF ('\n')
  48.  
  49. /*
  50.     WriteF ('DOS Description  :\n')
  51.     print_text (0, 32);  WriteF ('\n')
  52. */
  53.  
  54.     numFiles := make_int16 (34)
  55.     WriteF ('Number of Entries:  \d\n', numFiles)
  56.     numUsed := make_int16 (36)
  57.     WriteF ('Number Used      :  \d\n', numUsed)
  58.  
  59.     WriteF ('\nScanning Tape-Archive...\n')
  60.     FOR i := 0 TO numFiles-1
  61.     IF mem[64+(i*32)] = 1
  62.         WriteF ('#\d  ', i)
  63.         print_entry (64+(i*32))
  64.     ENDIF
  65.     ENDFOR
  66.     WriteF ('Done\n\n')
  67.  
  68.     IF numUsed = 0
  69.     WriteF ('According to the header info, there are no files in this archive.\n')
  70.     WriteF ('This is probably bogus.  The first entry is likely the converted file.\n\n')
  71.  
  72.     print_entry (64)
  73.  
  74.     WriteF ('Do you wish to extract this file (Y/N)?  ')
  75.     ReadStr (stdout, prompt);  UpperStr (prompt)
  76.  
  77.     IF prompt[0] = "Y"
  78.         WriteF ('Type the name you wish to give to this file:\n')
  79.         ReadStr (stdout, prompt)
  80.  
  81.         IF StrLen (prompt) > 0
  82.         extract_file (64, prompt)
  83.         ENDIF
  84.     ENDIF
  85.     ELSE
  86.     FOR i := 0 TO numFiles-1
  87.         IF mem[64+(i*32)] = 1
  88.         /* Pull & trim the filename from the directory entry */
  89.         j := 16
  90.         WHILE (mem[(64+(i*32)) + 16 + j - 1] = " ") AND (j >= 0)
  91.             j := j-1
  92.         ENDWHILE
  93.         SetStr (prompt, j)
  94.         StrCopy (prompt, mem + (64+(i*32)) + 16, j)
  95.     
  96.         extract_file (64+(i*32), prompt)
  97.         ENDIF
  98.     ENDFOR
  99.     ENDIF
  100.  
  101.  
  102.     CleanUp(0)
  103.  
  104.  
  105. /* Error conditions */
  106.  
  107. EXCEPT
  108.     SELECT exception
  109.     CASE NOARG
  110.         WriteF ('Usage:  UnT <archive.t64>\n')
  111.     CASE NOARCHIVE
  112.         WriteF ('Unable to open \s!\n', arg)
  113.     CASE EMPTYARCHIVE
  114.         WriteF ('Archive \s is EMPTY!\n', arg)
  115.     CASE NOMEMORY
  116.         WriteF ('Could not allocate enough memory.\n')
  117.     CASE READERROR
  118.         WriteF ('Read Error on \s.\n', arg)
  119.     DEFAULT
  120.         WriteF ('BAD SCENE, MAN!!!\n')
  121.     ENDSELECT
  122.     Close (handle)
  123.     CleanUp (-1)
  124. ENDPROC
  125.  
  126.  
  127.  
  128. PROC print_text (start, length)
  129.     DEF s[80]:STRING
  130.  
  131.     SetStr (s, length)
  132.     StrCopy (s, mem+start, length)
  133.     WriteF ('\e[40;33m\s\e[40;31m', s)
  134.  
  135. ENDPROC
  136.  
  137.  
  138.  
  139. PROC print_entry (rec_base)
  140.     DEF fileType
  141.  
  142.     fileType := mem[rec_base + 1]
  143.     SELECT fileType
  144.     CASE 1
  145.         WriteF ('PRG  "')
  146.     CASE 68
  147.         WriteF ('PRG  "')
  148.     /* other CASEs would be implemented if I had my 1541 manual here */
  149.     DEFAULT
  150.         WriteF ('???  "')
  151.     ENDSELECT
  152.  
  153.     print_text (rec_base + 16, 16)
  154.  
  155.     WriteF ('"  Start=$\z\h[4]  ', make_int16 (rec_base + 2))
  156.     WriteF ('End=$\z\h[4]\n', make_int16 (rec_base + 4))
  157.  
  158. ENDPROC
  159.  
  160.  
  161.  
  162. PROC extract_file (rec_base, name)  HANDLE
  163.     DEF length, i
  164.  
  165.     WriteF ('Extracting "\s"...', name)
  166.     length := make_int16(rec_base + 4) - make_int16(rec_base + 2)
  167.     
  168.     handle := Open (name, NEWFILE)
  169.     IF handle = NIL THEN Raise (CANTCREATE)
  170.  
  171.     i := Write (handle, (mem + rec_base + 2), 2)
  172.     IF i <> 2 THEN Raise (WRITEERROR)
  173.     i := Write (handle, (mem + make_int16 (rec_base + 8)), length)
  174.     IF i <> length THEN Raise (WRITEERROR)
  175.  
  176.     Close (handle)
  177.     WriteF ('  OK\n')
  178.  
  179. EXCEPT
  180.     SELECT exception
  181.     CASE CANTCREATE
  182.         WriteF ('Unable to create file!\n')
  183.     CASE WRITEERROR
  184.         WriteF ('Write Error!\n')
  185.     DEFAULT
  186.         WriteF ('BAD SCENE, MAN!!!\n')
  187.     ENDSELECT
  188.     Close (handle)
  189.     CleanUp (-1)
  190. ENDPROC
  191.  
  192.  
  193.  
  194. PROC make_int16 (address)
  195.     RETURN ( mem[address] + (256 * mem[address+1]) )
  196. ENDPROC
  197.